package com.gxm.练习.手写.linkedlist;



public class JdkLinkedList<E> {
    // 链表实际存储元素
    private int size;
    // 第一个元素(头节点,为了查询开始)
    private JdkLinkedList.Node first;
    // 最后一个元素(头节点,为添加开始)
    private JdkLinkedList.Node last;


    public void add(E e){
        Node node = new Node();
        node.object = e;
        //容器中为空时 添加元素
        if(first == null){
            first = node;
        } else {
            //不为空时 添加到尾部,原来的 尾部 节点变为 倒数第二,新添加的 变为最后的节点
            node.prev = last;
            last.next = node;
        }
        last = node;
        size++;
    }

    /**
     * 在指定位置添加元素
     *      原角标处节点后移 连在新的 节点之后
     *      原角标出前一个节点的 next 节点变为 新节点
     *
     * @param index
     * @param e
     */
    public void add(int index, E e) {
        Node oldIndexNode = getNode(index);
        Node oldPrevNode = oldIndexNode.prev;
        Node newIndexNode = new Node();
        newIndexNode.object = e;
        newIndexNode.prev = oldPrevNode;
        newIndexNode.next = oldIndexNode;
        oldIndexNode.prev = newIndexNode;
        size++;
    }


    public Node getNode(int index){
        //检查判断 索取角标 是否在 容器容量范围之内
        //从第一个开始取
        Node node = first;
        for (int i = 0; i < index; i++) {
            node = node.next;
        }
        return node;
    }
    // 链表节点存储元素
    private class Node {
        // 存放元素的值
        Object object;
        // 上一个节点Node
        JdkLinkedList.Node prev;
        // 下一个节点Node
        JdkLinkedList.Node next;

    }
}

